/**
 * IO函子
 */

const compose = (f: (...args: any) => any, g: (...args: any) => any) => {
  return value => f(g(value))
}

class IO {
  // of方法接收的是一个值，返回一个新的IO函子，新的IO函子传入一个函数来返回这个值
  static of (value) {
    return new IO(() => value)
  }

  _value: (...args: any) => any
  // 构造函数接收一个函数存储到_value
  constructor (fn) {
    this._value = fn
  }

  // map返回一个新的IO函子，新的IO函子接收map传入的函数与_value存储的函数的组合，
  // 这个组合的新函数将_value函数返回的值交给fn处理
  map (fn) {
    return new IO(compose(fn, this._value))
  }
}

// 输出进程执行路径是个不纯的操作，但是IO是纯的操作，IO传入相同的值永远返回的是一个相同的对这个值进行处理的函数
let r = IO.of(process).map(p => p.execPath)
console.log(r._value())

export {}
